using AbpVnext__Comon;
using Ebusiness_Domain.DomainService;
using Ebusiness_Domain.IRepository;
using Ebusiness_EntityFrameWork;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Serilog;
using Serilog.Events;
using Volo.Abp.Modularity.PlugIns;

namespace Ebusiness_Host
{
    public class Program
    {
        public static void Main(string[] args)
        {
            {
                //配置SerIlog
                var loggerConfiguration = new LoggerConfiguration()
#if DEBUG
                        .MinimumLevel.Debug()
#else
                        .MinimumLevel.Information()
#endif
                    .MinimumLevel.Override("Microsoft", LogEventLevel.Information)  // 按命名空间过滤
                     .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Information)  // 按命名空间过滤
                     .Enrich.FromLogContext()
                     //.WriteTo.Async(a => a.File(
                     //       path: "Logs/application-.log", // 动态文件名
                     //       rollingInterval: RollingInterval.Day, // 按天滚动
                     //       fileSizeLimitBytes: 1024 * 1024, // 单文件最大1MB
                     //       rollOnFileSizeLimit: true, // 超限后创建新文件
                     //       retainedFileCountLimit: 30, // 保留最近30个文件
                     //       outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}"  // 日志格式
                     //))
                     ////若要按日志级别（如 Error、Info）分文件存储，可扩展配置：
                     //.WriteTo.Logger(lc => lc
                     //     .Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Error)
                     //     .WriteTo.Async(a => a.File(
                     //         $"Logs/{DateTime.Now.ToString("yyyy-MM-dd")}/errors-.log",
                     //         rollingInterval: RollingInterval.Infinite,+
                     //         fileSizeLimitBytes: 1024 * 1024, // 错误日志单独限制1MB
                     //         rollOnFileSizeLimit: true, // 超限后创建新文件
                     //         retainedFileCountLimit: 30, // 保留最近30个文件

                     //         //u3：是一个格式说明符，表示将日志级别的名称格式化为一个统一的字符串，且只保留前三个字符。
                     //         //Information 将被格式化为 INF

                     //         //是一个格式说明符，表示将日志消息格式化为结构化日志（JSON 格式）。lj 代表 "log JSON"。
                     //         //使用 lj 格式化时，Serilog 会将消息内容转换为 JSON 格式，适合结构化日志记录，便于后续分析和处理。

                     //         //表示在日志输出中插入一个换行符。

                     //         //表示日志中包含的异常信息（如果有的话）。
                     //         //如果在记录日志时发生了异常，Serilog 会将异常的详细信息（如类型、消息和堆栈跟踪）包含在日志输出中。
                     //         outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}"  // 日志格式
                     //     ))
                     // )
                     // .WriteTo.Logger(lc => lc
                     //     .Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Information)
                     //      //.WriteTo.File("Logs/info-.log")
                     //      .WriteTo.Async(a => a.File(
                     //         $"Logs/{DateTime.Now.ToString("yyyy-MM-dd")}/info-.log",
                     //         rollingInterval: RollingInterval.Day,
                     //         fileSizeLimitBytes: 1024 * 1024, // 错误日志单独限制1MB
                     //         rollOnFileSizeLimit: true, // 超限后创建新文件
                     //          outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}"  // 日志格式
                     //     ))
                     // )
                     .WriteTo.Async(c => c.Console());

                Log.Logger = loggerConfiguration.CreateLogger();

                try
                {
                    var builder = WebApplication.CreateBuilder(args);
                    //清除日志工厂
                    //builder.Logging.ClearProviders();

                    //使用Abp模块，配置service
                    builder.Services.AddApplication<HostMoudule>(option =>
                    {
                        //加载插件，主项目动态扩展功能
                        //option.PlugInSources.AddFolder("D:\\学习\\项目\\Plugins");
                    });

                    //builder.Services.AddApplication<ProjectModule>(option =>
                    //{
                    //    //加载插件，主项目动态扩展功能
                    //    option.PlugInSources.AddFolder("E:\\项目\\ABP\\Plugins");
                    //});

                    //for (var i = 0; i < 100000; i++)
                    //{
                    //    Log.Information("开始启动项目.......");
                    //    Log.Error("开始启动项目.......");
                    //}

                    //使用aufofac中间件
                    //使用abp封装的Serilog日志
                    builder.Host.UseAutofac().UseSerilog();
                    var app = builder.Build();
                    //使用abp模块，配置中间件
                    app.InitializeApplication();

                    Log.Information("开始启动项目...");

                    app.Run();
                }
                catch (Exception ex)
                {
                    Log.Error($"项目运行失败:{ex.Message}");
                }
                finally
                {
                    //关闭日志 并将日志刷新到磁盘 
                    // 确保所有日志写入完成
                    Log.CloseAndFlush();
                    Console.WriteLine("项目关闭成功...");
                }
            }
        }
    }
}
